package cn.itcast.web.shiro;

import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.credential.SimpleCredentialsMatcher;
import org.apache.shiro.crypto.hash.*;
/**
 * 自定义凭证匹配器，自己指定对用户输入的密码的加密方式
 * 加密方案： md5加密，用户名作为盐。
 */
public class CusomtCredentialsMatcher extends SimpleCredentialsMatcher {

    /**
     * 在凭证匹配器中，指定对用户输入的密码的加密方式，以及最终的校验
     * @param token 封装用户输入的密码、账号
     * @param info 封装认证后的身份对象 （拿到的是user对象，也就是数据库中正确的密码）
     * @return
     */
    @Override
    public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
        //1. 获取用户输入的email
        String email = (String) token.getPrincipal();

        //2. 获取用户输入的密码
        String inputPwd = new String((char[]) token.getCredentials());

        //3. 对用户输入的密码加密、加盐
        String encodePwd = new Md5Hash(inputPwd,email).toString();

        //4. 获取数据库中正确的密码（数据库的密码要加密、加盐。 注意：要先修改数据库再测试）
        String dbPwd = (String) info.getCredentials();

        //5. 对比：用户输入的密码加密加盐后，与数据库的密码进行对比
        return encodePwd.equals(dbPwd);
    }
}
